2019/11/12 PM 12:05
這是複習的第二天,開始吧!
來看一下當時初次接觸JAVA稍稍困惑我一下的問題吧?
請問下列的兩段程式碼印出答案分別是甚麼?為甚麼?
1:
String s1 = "Brad";
String s2 = "Brad";
System.out.println(s1 == s2);
2:
String s3 = new String("Brad");
String s4 = new String("Brad");
System.out.println(s3 == s4);
想到答案了嗎?
答案為
System.out.println(s1 == s2):Ans為true
System.out.println(s3 == s4):Ans為false
為甚麼Ans不一樣呢?
s3跟s4答案是false的原因是,因為他們雖然內容相同,但遺憾的是他們各別都使用了new String()來創造出物件實體,所以可想而知系統會在記憶體規劃出兩個不同區塊分別放s3、s4物件實體,代表s3為一個物件s4又為一個物件兩個存放在記憶體內不同位子,由於是不同的物件所以答案為false。
拿s1跟s2為甚麼是true呢?當系統看到java裡,String s1 = "Brad";的時候,系統會幫忙創造出物件實體,並把s1放在規劃好的位子上,但注意到了嗎?當系統看到String s2 = "Brad";他並沒有使用new,所以系統會先去尋找一下發現s2需要的內容,s1已經存在了,所以系統會把s2也指向s1的位子,所以既然指向同一個位子就代表著,s1跟s2指向的是同一個物件,所以System.out.println(s1 == s2);翻成白話的意思是?請問s1物件實體與s2物件實體在記憶體內的位子一樣嗎?一樣所以也代表他們是同一個物件,所以Ans為true
怕有人看到這跟我當初一樣腦袋卡住,我再舉一個例子說明清楚一點
當時的我想那如果是以下這樣呢?
String s1 = "Brad";
String s2 = "Apple";
別鬧了,內容不一樣啊,系統找不到還是會去規劃一個地方放這個新的,既然不同位子又產生新的,那代表不是同一個物件了,自然答案就為false了,希望初學者不要像我當初一樣卡了5分鐘。
請注意內容要一樣,系統才會在記憶體內找到擁有一樣內容的位子,才能指向過去。but如果你是用new那儘管內容一樣,如同上面的範例,他還是會個別規劃空間喔!
那看到這你產生疑問?那如果我不想管這些,我只想比我的String物件的內容是否相同呢?別擔心,Java早就設計好了,String的類別透過Override的方式,改寫Java.lang.Object的equals方法,讓你可以去比對字串的內容。
System.out.println(s3.equals(s4));
Ans:true
請記得你使用的類別並沒有去override本來Object的equals方法的內容,那在沒有複寫的情況下,他就與 == 是相同的用法。
以下用程式碼舉例一下:
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1 == obj2);
System.out.println(obj1.equals(obj2));
答案都是false喔,可以去嘗試玩一下。